package daoImpl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;

import org.apache.log4j.Logger;

import queries.QueriesPagamento;

import constants.Constants;
import dao.PagamentoDAO;

import util.Helper;
import entities.Apartamento;
import exceptions.DataInvalidaException;
import exceptions.ValorMonetarioInvalidoException;

public class PagamentoDAOImpl implements PagamentoDAO{

	private static Logger log = Logger.getLogger(PagamentoDAOImpl.class);

	private static PagamentoDAOImpl pagamentoDAOImpl = null;

	private PagamentoDAOImpl(){
	}

	public static PagamentoDAOImpl getInstance(){
		if(pagamentoDAOImpl == null){
			pagamentoDAOImpl = new PagamentoDAOImpl();
		}
		return pagamentoDAOImpl;
	}

	public void validaCamposCadPagamento(String dataPagamento, String desconto) throws DataInvalidaException, ValorMonetarioInvalidoException{

		log.debug("Inicio do metodo PagamentoDAOImpl.validaCamposCadPagamento. Validando os dados: Data de pagamento < " +
				dataPagamento + " > e desconto < " + desconto + " >.");

		if(Helper.dataIsValida(dataPagamento)){
			try{
				Double.parseDouble(desconto);
			}catch (NumberFormatException e){
				throw new ValorMonetarioInvalidoException("DESCONTO");
			}
		}
		else{
			throw new DataInvalidaException("DATA DE PAGAMENTO");
		}
	}

	public void cadastrarPagamento(Apartamento apto, String dataPagamento, String dataVencimento, String valor, String multa,
			String juros, String total, String desconto, String multaPorTerpagoAtrasado, String valorRecebido, boolean isAluguel, Connection connection)
	throws SQLException, ParseException, DataInvalidaException, ValorMonetarioInvalidoException {

		log.debug("Inicio do metodo PagamentoDAOImpl.cadastrarPagamento. Os dados do pagamento sao: " + Constants.LINE_SEPARATOR +
				"Numero do Apartameto: " + apto.getNumero() + Constants.LINE_SEPARATOR +
				"Bloco do Apartamento: " + apto.getBloco() + Constants.LINE_SEPARATOR +
				"Data de Pagamento: " + dataPagamento + Constants.LINE_SEPARATOR +
				"Data de Vencimento: " + dataVencimento + Constants.LINE_SEPARATOR +
				"Valor: " + valor + Constants.LINE_SEPARATOR +
				"Multa: " + multa + Constants.LINE_SEPARATOR +
				"Desconto" + desconto + Constants.LINE_SEPARATOR +
				"Juros: " + juros + Constants.LINE_SEPARATOR +
				"Multa por ter pago atrasado: " + multaPorTerpagoAtrasado + Constants.LINE_SEPARATOR +
				"Credito / Debito: " + apto.getCreditoDebito() + Constants.LINE_SEPARATOR +
				"Total: " + total + Constants.LINE_SEPARATOR +
				"Valor Recebido: " + valorRecebido + Constants.LINE_SEPARATOR +
				"Pagamento de Aluguel: " + isAluguel);


		validaCamposCadPagamento(dataPagamento, desconto);

		double valorD = Double.valueOf(valor);
		double multaD = Double.valueOf(multa);
		double jurosD = Double.valueOf(juros);
		double totalD = Double.valueOf(total);
		double descontoD = Double.valueOf(desconto);
		double multaPorPagarAtrasadoD = Double.valueOf(multaPorTerpagoAtrasado);
		double vlrRecebidoD = Double.valueOf(valorRecebido);

		PreparedStatement pstm = connection.prepareStatement(QueriesPagamento.CADASTRA_PAGAMENTO);

		pstm.setDate(1, new java.sql.Date(Helper.getStringAsSimpleDate(dataPagamento).getTime()));
		pstm.setDate(2, new java.sql.Date(Helper.getStringAsSimpleDate(dataVencimento).getTime()));

		if(totalD > valorD){
			pstm.setBoolean(3, true);
		}
		else{
			pstm.setBoolean(3, false);
		}

		pstm.setString(4, apto.getNumero());

		pstm.setString(5, apto.getBloco());

		pstm.setBoolean(6, isAluguel);
		pstm.setDouble(7, valorD);
		pstm.setDouble(8, multaD);
		pstm.setDouble(9, jurosD);
		pstm.setDouble(10, totalD);
		pstm.setDouble(11, multaPorPagarAtrasadoD);
		pstm.setDouble(12, apto.getCreditoDebito());
		pstm.setDouble(13, vlrRecebidoD);
		pstm.setDouble(14, descontoD);

		pstm.executeUpdate();

	}

	@Override
	public boolean pagouEmDia(String numero, String bloco,
			java.util.Date dataVencimento, Connection connection) throws SQLException {

		log.debug("Inicio do metodo PagamentoDAOImpl.pagouEmDia. Verificando se o apartamento de numero < "
				+ numero + " > e bloco < " + bloco + " > pagou o condominio atrasado.");

		PreparedStatement pstm = connection.prepareStatement(QueriesPagamento.APTO_PAGOU_COND_EM_DIA);

		pstm.setString(1, numero);
		pstm.setString(2, bloco);
		pstm.setDate(3, new java.sql.Date(dataVencimento.getTime()));

		ResultSet rs = pstm.executeQuery();

		return rs.next();

	}

	@Override
	public boolean jaEfetuouAlgumPagamento(String numero, String bloco, boolean isAluguel, Connection connection) throws SQLException {

		String tipo = "Condominio";

		if(isAluguel){
			tipo = "Aluguel";
		}

		log.debug("Inicio do metodo PagamentoDAOImpl.JaPagouCondominio. Verificando se o apartamento de numero < "
				+ numero + " > e bloco < " + bloco + " > efetuou algum pagamento de " + tipo);

		PreparedStatement pstm = connection.prepareStatement(QueriesPagamento.EFETUOU_ALGUM_PAGAMENTO);

		pstm.setString(1, numero);
		pstm.setString(2, bloco);
		pstm.setBoolean(3,isAluguel);

		ResultSet rs = pstm.executeQuery();

		return rs.next();
	}
}
